from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import redirect
from django.core.urlresolvers import reverse
from django.core.paginator import Paginator
from datetime import datetime

from common.models import Users, Types, Goods

# 公共信息加载函数


def loadinfo(request):
    '''加载商品类别信息'''
    lists = Types.objects.filter(pid=0)
    context = {'typelist': lists}
    return context


def index(request):
    '''项目前台首页'''
    context = loadinfo(request)

    # 按点击量排序获取最高的5条热卖商品信息
    goodslist = Goods.objects.filter().order_by('-clicknum')[:5]

    # 设置热卖商品冠亚季军标志
    i = 0
    for goods in goodslist:
        if i == 0:
            goods.sign = '冠军'
        elif i == 1:
            goods.sign = '亚军'
        elif i == 2:
            goods.sign = '季军'
        else:
            goods.sign = ''
        i += 1

    # 获取数码类的子类别，以及数码类商品最新的4条新品信息
    threecid = Types.objects.get(name='数码').id
    threectypes = Types.objects.filter(pid=threecid)
    threeclist = Goods.objects.filter(typeid__in=Types.objects.only('id').filter(pid=threecid)).order_by('-addtime')[:4]

    # 获取服装类的子类别，以及服装类商品最新的4条新品信息
    clothid = Types.objects.get(name='服装').id
    clothtypes = Types.objects.filter(pid=clothid)
    clothlist = Goods.objects.filter(typeid__in=Types.objects.only('id').filter(pid=clothid)).order_by('-addtime')[:4]

    # 封装模板中需要的信息并跳转到商城首页
    context['goodslist'] = goodslist
    context['threectypes'] = threectypes
    context['threeclist'] = threeclist
    context['clothtypes'] = clothtypes
    context['clothlist'] = clothlist
    return render(request, "web/index.html", context)


def lists(request, pIndex=1):
    '''商品列表页'''
    context = loadinfo(request)
    # 调用公共信息加载函数,获取商品类别中的父类别,这里是服装,食品和数码

    # 查询商品信息
    mod = Goods.objects
    # 这么写的用处是后面编写代码会方便，比如要查询就不用Goods.objects.filter(),直接mod.filter()

    mywhere = []
    # 判断封装搜索条件
    tid = int(request.GET.get("tid", 0))
    if tid > 0:
        # tid是在base.html中跳转来list.html传递的参数,tid={{type.id}},type是typelist的某个实例对象,typelist是调用公共信息加载函数时拿到的所有的父类别的信息.
        # 这句话拿到的实际是type数据表里面父类别的id号
        list = mod.filter(typeid__in=Types.objects.only('id').filter(pid=tid))
        mywhere.append('tid=' + str(tid))
    else:
        # 获取商品信息
        # filter过滤条件是pid=tid,比如你点击了服装,传过来的tid就是1,而pid是1的就是父类别下面的子类别有女装,男装,童装.那么得到分别是3,7,8.
        # 前面的Types.objects.only('id')就是只获取了id号信息,有1,2,3.....,9
        # 结合filter过滤,就是最终拿到3,7,8
        #__in是其中之一,但不是只取一条信息的意思,而是某一件商品的typeid是3,7,8其中之一就行的意思.
        # 把数据库里面所有符合的商品信息全部拿出来赋值给list
        # str(tid),比如我们这里讲的是服装,那么tid就是1,把tid=1放进了mywhere中
        list = mod.filter()
        # 查询获得所有数据,即是点击全部商品的时候,因为tid这个参数为空值,显示得就是所有商品的信息

    # 执行分页处理
    pIndex = int(pIndex)
    page = Paginator(list, 8)
    # 以8条每页创建分页对象
    # 如果有24条商品信息数据在goods数据表中,你可以理解成Paginator(list,8).,包含了两个功能,首先是page=Goods.objects.all()获取了数据表中的所有的商品信息
    # 然后再用了Paginator(list,8)中的分页功能,将24条数据分成三部分
    maxpages = page.num_pages  # 最大页数
    # 判断页数是否越界
    if pIndex > maxpages:
        pIndex = maxpages
    if pIndex < 1:
        pIndex = 1
    list2 = page.page(pIndex)
    # 当前页数据,是当前页所包含的八条的商品的数据信息
    plist = page.page_range
    # 如果你有24条数据,则plist=[1,2,3],记住了page.page_range返回的是一个列表,配合着bookstrap的css样式,就可以弄一个分页操控器

    # 封装模板中需要的信息
    context['goodslist'] = list2
    context['plist'] = plist
    context['pIndex'] = pIndex
    context['pIndex'] = pIndex
    context['mywhere'] = mywhere
    return render(request, "web/list.html", context)


def detail(request, gid):
    '''商品详情页'''
    context = loadinfo(request)
    ob = Goods.objects.get(id=gid)
    ob.clicknum += 1
    ob.save()
    context['goods'] = ob
    return render(request, "web/detail.html", context)

# ==============前台会员登录====================


def login(request):
    '''会员登录表单'''
    return render(request, 'web/login.html')


def dologin(request):
    '''会员执行登录'''

    try:
        # 根据账号获取登录者信息
        user = Users.objects.get(username=request.POST['username'])
        # 判断当前用户是否是后台管理员用户
        if user.state == 0 or user.state == 1:
            # 验证密码
            import hashlib
            m = hashlib.md5()
            m.update(bytes(request.POST['password'], encoding="utf8"))
            if user.password == m.hexdigest():
                # 此处登录成功，将当前登录信息放入到session中，并跳转页面
                request.session['vipuser'] = user.toDict()
                return redirect(reverse('index'))
            else:
                context = {'info': '登录密码错误！'}
        else:
            context = {'info': '此用户为非法用户！'}
    except:
        context = {'info': '登录账号错误！'}
    return render(request, "web/login.html", context)


def logout(request):
    '''会员退出'''
    # 清除登录的session信息
    del request.session['vipuser']
    # 跳转登录页面（url地址改变）
    return redirect(reverse('login'))

# ==============前台会员注册====================


def register(request):
    '''会员注册表单'''
    return render(request, 'web/register.html')


def doregister(request):
    '''执行会员注册'''
    try:
        # 判断登录账号是否有重复
        if Users.objects.filter(username=request.POST['username']).count() > 0:
            context = {'info': '登录账号已经被注册！'}
        else:
            # 判断登录密码和重复密码是否一致
            if request.POST['password'] != request.POST['repassword']:
                context = {'info': '两次输入密码不一致！'}
            else:
                # 执行添加会员信息
                ob = Users()
                ob.username = request.POST['username']
                # 获取密码并md5
                import hashlib
                m = hashlib.md5()
                m.update(bytes(request.POST['password'], encoding="utf8"))
                ob.password = m.hexdigest()
                ob.addtime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                ob.save()

                # 此处注册和登录成功，将当前登录信息放入到session中，并跳转到商城首页
                request.session['vipuser'] = ob.toDict()
                return redirect(reverse('index'))

    except Exception as err:
        print(err)
        context = {'info': '注册账号失败！'}

    return render(request, "web/register.html", context)
